001    /**
002     * Created by IntelliJ IDEA.
003     * User: Wei Wang
004     * Date: Apr 16, 2003
005     * Time: 11:31:25 PM
006     */
007    
008    package EVolve.util;
009    
010    import EVolve.Scene;
011    import EVolve.ProcessingThread;
012    
013    import javax.swing.*;
014    import java.awt.*;
015    import java.awt.event.*;
016    import java.text.NumberFormat;
017    import EVolve.data.Worker;
018    
019    public class ProgressIndicator extends JDialog implements Runnable{
020        private JProgressBar progressBar;
021        private JButton buttonPause, buttonResume, buttonStop;
022        private Thread self = null;
023        private Worker worker;
024        private boolean mustStop;
025        private ProcessingThread workerTd;
026    
027        public ProgressIndicator(JFrame owner, Worker worker, ProcessingThread workerTd) {
028            super(owner,"Process progress");
029    
030            mustStop = false;
031            this.worker = worker;
032            this.workerTd = workerTd;
033            createUI();
034            repaint();
035            self = new Thread(this);
036            self.start();
037        }
038    
039        private void createUI() {
040            setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
041    
042            progressBar = new JProgressBar();
043            JPanel panelButton = new JPanel(new GridLayout(1,3));
044    
045            buttonResume = new JButton(new ImageIcon(Scene.getGifURL("play.gif")));
046            buttonResume.setToolTipText("Resume Processing");
047            buttonResume.addActionListener(new ActionListener() {
048                public void actionPerformed(ActionEvent e) {
049                    resume();
050                }
051            });
052            buttonResume.setPreferredSize(new java.awt.Dimension(30,25));
053            buttonResume.setEnabled(false);
054    
055            buttonPause = new JButton(new ImageIcon(Scene.getGifURL("pause.gif")));
056            buttonPause.setToolTipText("Pause Processing");
057            buttonPause.addActionListener(new ActionListener() {
058                public void actionPerformed(ActionEvent e) {
059                    pause();
060                }
061            });
062            buttonPause.setPreferredSize(new java.awt.Dimension(30,28));
063    
064            buttonStop = new JButton(new ImageIcon(Scene.getGifURL("stop.gif")));
065            buttonStop.setToolTipText("Stop Processing");
066            buttonStop.addActionListener(new ActionListener() {
067                public void actionPerformed(ActionEvent e) {
068                    stop();
069                }
070            });
071            buttonStop.setPreferredSize(new java.awt.Dimension(30,28));
072    
073            panelButton.add(buttonResume);
074            panelButton.add(buttonPause);
075            panelButton.add(buttonStop);
076    
077            Box box = new Box(BoxLayout.Y_AXIS);
078            progressBar.setPreferredSize(new Dimension(290,25));
079    
080            box.add(Box.createVerticalStrut(8));
081            box.add(progressBar);
082            box.add(Box.createVerticalStrut(5));
083            box.add(panelButton);
084            getContentPane().add(box);
085            progressBar.setStringPainted(true);
086            progressBar.setValue(0);
087            progressBar.setBorderPainted(true);
088            pack();
089            Scene.getUIManager().showDialog(this,300,100);
090        }
091    
092        public void run() {
093            Scene.getUIManager().updateFunctionControl(false);
094    
095            long totalEvents = worker.getMaxProgress();
096            while (worker.getCurrentState() == Worker.STATE_NOT_STARTED) {
097                self.yield();
098            }
099    
100            while (worker.getCurrentState() != Worker.STATE_FINISHED) {
101                try {
102                    long current = worker.getCurrentProgress();
103                    double percent = (double)current/(double)totalEvents;
104                    if (totalEvents > 0L) {
105                        progressBar.setValue((int)(percent*100));
106                        progressBar.setString("Data processed: " + NumberFormat.getPercentInstance().format(percent));
107                    }
108                    self.sleep(100);
109                } catch (InterruptedException e) {
110                    if (mustStop || worker.getCurrentState() >= Worker.STATE_STOPPING) {
111                        break;
112                    }
113                }
114            }
115            progressBar.setValue(100);
116            progressBar.setString("Data processed: " + NumberFormat.getPercentInstance().format(1));
117            try {
118                workerTd.join();
119            } catch (InterruptedException e1) {
120            }
121            setVisible(false);
122            dispose();
123            worker.resetState();
124            Scene.getUIManager().updateFunctionControl(true);
125        }
126    
127        public void stop(){
128            worker.stop();
129            if (self != null) {
130                mustStop = true;
131                self.interrupt();
132            }
133            Scene.getUIManager().updateFunctionControl(true);
134            self = null;
135            setVisible(false);
136            dispose();
137        }
138    
139        public void resume() {
140            buttonResume.setEnabled(false);
141            buttonPause.setEnabled(true);
142            worker.resume();
143        }
144    
145        public void pause() {
146            buttonResume.setEnabled(true);
147            buttonPause.setEnabled(false);
148            worker.pause();
149        }
150    }